package com.gmall.java;


//函数式接口 接口只有一个未实现的方法
@FunctionalInterface
interface Show<T>{
    void show(T s);

    //void print(String s);
}

interface MathOperation<T>{
    T operation(T a, T b);

    static public void show(){
        System.out.println("static1");
    }

    //JDK 8
    default public void show2(){
        System.out.println("default method2");
    }
    default public void show3(){
        System.out.println("default method3");
    }
}

class Add implements MathOperation<Integer>{
    @Override
    public Integer operation(Integer a, Integer b) {
        return a + b;
    }
}

class Subtract implements MathOperation<Integer>{
    @Override
    public Integer operation(Integer a, Integer b) {
        return a - b;
    }
}

public class FunctionInterfaceTest1 {

    public static void main(String[] args) {

        MathOperation<Integer> add = new Add();
        System.out.println("10 + 5 = " + add.operation(10, 5));
        MathOperation.show();
        add.show2();

        MathOperation<Float> mathOperation = (a,b)->{return a+b;};


        //匿名内部类
        MathOperation<Integer> multiply = new MathOperation<Integer>() {
            @Override
            public Integer operation(Integer a, Integer b) {
                return a*b;
            }
        };
        System.out.println("10 * 5 = " + multiply.operation(10, 5));

        //Lambda 表达式 (参数类型 参数,参数类型 参数,...)->{ 执行的语句;}
        /* ()->{}
         * 参数列表: 类型可以省略
         *         如果方法体只有一行代码，{} return可以省略
         *         如果只有一个参数 （）可以省略
         *
         * 可选类型声明：不需要声明参数类型，编译器可以统一识别参数值。
         * 可选的参数圆括号：一个参数无需定义圆括号，但多个参数需要定义圆括号。
         * 可选的大括号：如果主体包含了一个语句，就不需要使用大括号。
         * 可选
         */
        MathOperation<Integer> divide = (a,b)->a/b;
        System.out.println(divide.operation(10,5));

        Show<String> show1 = s-> System.out.println(s);

        show1.show("-------------------");
    }
}
